這篇文章將介紹 FastAPI,這是一個與之前提到的 Django 和 Flask 同屬於 Web Application 框架。由於具備以下幾個特點,FastAPI 逐漸成為新星。
資料驗證
FastAPI 依賴於前面介紹的 Pydantic 來驗證請求和回應資料。由於其驗證語法採用 Python 3.5 推出的型別註釋,使得開發者能夠輕鬆上手。
自動生成文件
Web Application 會開放多個端點,以便用戶根據自身需求選擇適合的端點。以購物平台的商品為例,用戶可以呼叫 GET /products/
來獲取所有商品資訊,或使用 POST /products/
並提供商品名稱和價格來創建新商品。這兩個端點都遵循之前介紹的 RESTful 格式(HTTP 方法 GET 用於獲取資源,HTTP 方法 POST 用於創建資源)。如果開發者能提供端點的使用說明書,詳細說明如何使用各個端點以及注意事項,將大大提升用戶的使用體驗。此外,當存在許多用戶時,提供說明書可以有效降低雙方之間的溝通成本,避免重複解釋相同內容。
對於許多 Web Application 框架(例如 Flask),開發者需要花費額外的時間來撰寫文檔。而 FastAPI 則能自動根據程式碼中的型別生成文檔,這大大降低了撰寫文檔的成本。
性能
在之前的 Django 文章中,我們提到過 wsgi.py
和 asgi.py
這兩個檔案,並在 Gunicorn 的文章中詳細介紹了 WSGI。而 ASGI 目前尚未深入探討,FastAPI 正是基於 ASGI 架構,因此其性能得到了顯著提升。這部分內容將在下一篇文章中詳細介紹,本篇文章暫時略過。
本次範例使用的是 FastAPI 0.112.4 版本。通常情況下,可以使用 poetry add fastapi==0.112.4
成功安裝 FastAPI。為了方便後續的開發,通常會額外安裝 standard 套件包,因此安裝指令會變更為以下
poetry add "fastapi[standard]==0.112.4"
首先,開發者需要根據 Pydantic 的規範來定義 Product 類別,在上一篇的 Pydantic 文章中已有詳細介紹。
接下來,開發者可以定義端點,其定義方式與 Python 的函數型別提示類似。比如,在範例中,函數的參數類型為空,而返回類型為 list[Product]。FastAPI 將通過這些型別提示來驗證接收到的 Request 和返回的 Response。
from fastapi import FastAPI
from pydantic import BaseModel, PositiveInt
class Product(BaseModel):
name: str
price: PositiveInt
app = FastAPI()
@app.get("/products/")
def get_products() -> list[Product]:
return [
Product(name="demo_1", price=56),
Product(name="demo_2", price=102),
]
開發者可以通過執行指令 poetry run fastapi dev main.py
來啟動 Web Application
如果在網頁瀏覽器中輸入 http://127.0.0.1:8000/products/
,將能夠獲取所有商品資訊(如下圖所示)。
如果在網頁瀏覽器中輸入 http://127.0.0.1:8000/docs
,將能看到自動生成的文檔(如下圖所示)。這份文檔是由名為 Swagger 的工具生成的。由於 FastAPI 與 Swagger 之間有高度整合,因此 FastAPI 能夠根據端點的型別提示自動生成文檔。在文檔中,您會看到 Parameters 區塊顯示為 No parameters,而 Responses 區塊則顯示一系列商品資訊,包括商品名稱(name)和價格(price)。
接下來,開發者可以定義一個用於新增商品的端點,該端點採用 POST HTTP Method。在範例中,函數的參數類型為 Product 類別,而返回類型也為 Product 類別。
@app.post("/products/")
def add_product(product: Product) -> Product:
return product
同樣地,在網頁瀏覽器中輸入 http://127.0.0.1:8000/docs
,可以查看新端點的資訊。Parameters 區塊顯示了該端點需要提供新的商品名稱(name)以及商品價格(price),而 Response 的結構則與商品資訊相同。